package org.zjx.analysis.identify;

import lombok.SneakyThrows;
import net.sourceforge.tess4j.Tesseract;

import java.awt.image.BufferedImage;

public class TessNumberUtil {

    public static String tessIdentify(BufferedImage bufferedImage) {
        String resultChi = tessIdentifyWithLanguage(bufferedImage, "chi_sim");
        String resultEng = tessIdentifyWithLanguage(bufferedImage, "eng");

        return mergeAndCorrectResults(resultChi, resultEng);
    }

    /**
     * 逐个字符比对并修正识别结果
     */
    private static String mergeAndCorrectResults(String chi, String eng) {
        if (chi == null) chi = "";
        if (eng == null) eng = "";

        StringBuilder finalResult = new StringBuilder();
        int i = 0, j = 0;

        while (i < chi.length() || j < eng.length()) {
            char chiChar = (i < chi.length()) ? chi.charAt(i) : '\0';
            char engChar = (j < eng.length()) ? eng.charAt(j) : '\0';

            // 情况1: 英文识别为'/'，中文识别为'1' → 采用'/'
            if (engChar == '/' && chiChar == '1') {
                finalResult.append('/');
                i++;
                j++;
            }
            // 情况2: 中文识别为'0'，英文不是'0'，且英文字符在中文'0'之后 → 添加'0'，中文指针前进
            else if (chiChar == '0' && engChar != '0' && engChar != '\0') {
                finalResult.append('0');
                i++;
            }
            // 情况3: 英文识别为数字或斜杠，优先采用英文结果
            else if (isValidChar(engChar)) {
                finalResult.append(engChar);
                j++;
                // 如果中文当前字符也是有效字符，但被英文跳过，中文指针也前进
                if (isValidChar(chiChar)) {
                    i++;
                }
            }
            // 情况4: 英文无效但中文有效，采用中文结果
            else if (isValidChar(chiChar)) {
                finalResult.append(chiChar);
                i++;
                // 如果英文当前字符也是有效字符，但被中文跳过，英文指针也前进
                if (isValidChar(engChar)) {
                    j++;
                }
            }
            // 情况5: 两个都无效，跳过当前字符
            else {
                if (chiChar != '\0') i++;
                if (engChar != '\0') j++;
            }
        }

        return finalResult.toString();
    }

    /**
     * 检查字符是否为有效字符（数字或斜杠）
     */
    private static boolean isValidChar(char c) {
        return (c >= '0' && c <= '9') || c == '/';
    }

    @SneakyThrows
    private static String tessIdentifyWithLanguage(BufferedImage bufferedImage, String language) {
        Tesseract tess4J = new Tesseract();
        tess4J.setVariable("user_defined_dpi", "300");
        tess4J.setDatapath("src/main/resources/tessdata");
        tess4J.setVariable("tessedit_char_whitelist", "0123456789/");
        tess4J.setLanguage(language);
        tess4J.setPageSegMode(7);
        tess4J.setOcrEngineMode(1);

        String result = tess4J.doOCR(bufferedImage);
        // 清理结果，只保留数字和斜杠
        return result != null ? result.replaceAll("[^0-9/]", "") : "";
    }
}
